package com.内部类.匿名内部类;  //417
/**两种调用方法
 * 1.直接new匿名内部类对象后调用；
 * 2.创建匿名内部类，将匿名内部类对象赋给父类引用，再用引用调用其内部类的eat方法
 * new Person(){  }.eat();  相当于 class Outer03$1 extends Person{ } 然后再new Outer03$1() 调用其eat方法
 *
 * 3.匿名内部类不能添加访问修饰符，因为匿名  内部类是定义在方法内部的；
 * 4.外部其他类不能访问匿名内部类，因为匿名内部类是局部变量；
 * 5.如果外部类和内部类的成员变量重名，默认遵循就近原则；如果有访问外部类的成员变量，则需要使用  外部类名.this.成员变量名；
 * */

public class Anonymous_Inner_Class_Detail {
    public static void main(String[] args) {
       new Outer03().method01();
       new Outer03().method02();
    }
}
class Outer03{
    /**1.直接new匿名内部类对象后调用；*/
    public void method01(){
        new Person(){  // 创建匿名内部类,继承Person类，并同时直接调用其内部类的eat方法
            public void eat(){
                System.out.println("匿名内部类重写eat1方法");
            }
        }.eat();  //动态绑定，调用Outer03$1  eat1方法
    }

    /**2.创建匿名内部类，将匿名内部类对象赋给父类引用，再用引用调用其内部类的eat方法；*/
    public void method02(){
        Person p = new Person(){  // 创建匿名内部类,继承Person类，将对象赋给Person类型引用 p，用引用名称调用其内部类的eat方法
            public void eat(){
                System.out.println("匿名内部类重写eat2方法");
            }
        };
        p.eat();  //动态绑定，调用Outer03$1  eat方法
    }
}

class Person{  //类/抽象类/接口都可以创建匿名内部类
    public void eat(){ }
}